<?php

class User_User extends Service_Pager {
	
	/* @var $idUser  */
	public $idUser;
	public $login;
	public $email;
	public $pswrd;
	public $fio;
	public $job;
	public $icq;
	public $phone;
	public $url;
	
	public $birthDay;
	public $birthDay_day;
	public $birthDay_month;
	public $birthDay_year;
	public $city;
	public $country;
	
	public $arrUserInfo;
	
	private $arrUsersGroups;
	
	// дополнительно для метода regUserWithValidation

	public $pass1;
	public $pass2;
	public $firstName;
	public $lastName;
	public $sex;
	public $relationshipStatus;
	public $profession;
	public $professionExperience;
	public $regKcapthca;
	public $regConfirmTerms;
	public $shortReg = false;
	
	
	
	/**
	 * Сообщение пользователю об ошибке или успехе выполнения некоторй операции
	 *
	 * @var string
	 */
	private static $userMessage;
	/**
	 * Тип сообщение пользователю об ошибке или успехе выполнения некоторй операции
	 * <0 - сообщение об ошибке
	 * 0 - нет сообщения
	 * >0 - сообщение об успехе
	 * @var integer
	 */
	private static $userMessageType;	
	
	private $loggedIn;
	private $isAdmin;
	private $isOnline;
	

	public function __construct(){
		
		$this->idUser = NULL;
		$this->login = NULL;
		$this->email = NULL;
		$this->pswrd = NULL;
		$this->fio = NULL;
		$this->job = NULL;
		$this->icq = NULL;
		$this->phone = NULL;
		$this->url = NULL;
		
		$this->birthDay = NULL;
		$this->city = NULL;
		$this->country = NULL;
		
		$this->loggedIn = false;
		$this->isAdmin = false;
		$this->isOnline = true;
		
		// допустимые группы пользователей для проверки функцией checkIfUser()
		$this->arrUsersGroups = array("member", "admin", "redactor", "expert", "manager", "seo", "moder", "speaker");
	}
	
  static public function instance(){
    static $objUser;
    if (!isset($objUser)) {
      $objUser = new User_User();
    }
    return $objUser;
  }
  static public function instance2(){
    static $objUserProfile;
    if (!isset($objUserProfile)) {
      $objUserProfile = new User_User();
    }
    return $objUserProfile;
  }  

	public function setIdUser($idUser){
		$this->idUser = $idUser;
		$this->userStart();
	}
	
	public function setUserLogin($login){
		$this->login = $login;
	}
	public function setUserEmail($email){
		$this->email = $email;
	}
	public function setUserPswrd($pswrd){
		$this->pswrd = $pswrd;
	}
	public function setUserFIO($fio){
		$this->fio = $fio;
	}
	public function setUserJob($job){
		$this->job = $job;
	}
	public function setUserICQ($icq){
		$this->icq = $icq;
	}
	public function setUserPhone($phone){
		$this->phone = $phone;
	}
	public function setUserURL($url){
		$this->url = $url;
	}
	
	public function setUserBirthday($birthDay){
		$this->birthDay = $birthDay;
	}
	public function setUserCity($city){
		$this->city = $city;
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////

	public function isAdmin(){
		return $this->isAdmin;
	}
	
	public function isOnline(){
		return $this->isOnline;
	}

	public function getIdUser(){
		return $this->idUser;
	}
	
	public function getUserFIO(){
		return $this->fio != NULL ? $this->fio : $this->_getUserFIO();
	}
	
	public function getUserBirthDay(){
		return $this->birthDay != NULL ? $this->birthDay : $this->_getUserBirthDay();
	}
	
	public function getUserCity(){
		return $this->city != NULL ? $this->city : $this->_getUserCity();
	}

	public function getUserCountry(){
		return $this->country != NULL ? $this->country : $this->_getUserCountry();
	}
		
/////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * Функция проверяет залогинен ли пользователь
	 *
	 * @return boolean
	 */
	public function isLoggedIn(){
		if ($this->loggedIn != NULL)
			return $this->loggedIn;
		else return false;
	}
	
	
	// не используется
	// сейчас работает через сессии
	public function logIn($login, $md5password){
		$objDB = Service_Database::instance(); //  AND status = 1
		$arrUser = $objDB->selectOne("SELECT * FROM users WHERE name = '".$login."' AND pass = '".$md5password."'");
		if (sizeof($arrUser) == 0) return false;
		else {
			$this->loggedIn = true;
			$this->login = $arrUser['name'];
			$this->idUser = $arrUser['id'];
			$this->pswrd = $arrUser['pass'];
			
			setcookie("current_user", $this->login, time() + 3600*24*2);
			setcookie("wrdp", $this->pswrd, time() + 3600*24*2);
			setcookie("id_us", $this->idUser, time() + 3600*24*2);
			
			// если пользователя еще нет в users
			if (!$objDB->selectSimpleField("SELECT id_user FROM ".DB_PREFIX."users WHERE id_user = ".$this->idUser))
				$objDB->insert(DB_PREFIX."users", array("id_user" => $this->idUser));
				
			return true;		
		}
	}
	
	public static function checkLogin($login){
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("SELECT name FROM users WHERE name = '".$login."'");
	}

        public static function checkLoginWithoutCurrent($login){
		$objDB = Service_Database::instance();
                $objUser = User_User::instance();
		return $objDB->selectSimpleField("SELECT name FROM users WHERE name = '".$login."' AND users.id != ".$objUser->getIdUser());
	}
	
	public static function checkEmail($email){
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("
		SELECT users.id 
		FROM users 
		LEFT JOIN ".DB_PREFIX."users ON ".DB_PREFIX."users.id_user = users.id 
		WHERE email = '".$email."'");
	}
	
	public static function checkEmailFromTableUsers($email){
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("SELECT users.id FROM users WHERE email = '".$email."'");		
	}
        
	public static function checkEmailFromTableUsersWithoutCurrent($email){
		$objDB = Service_Database::instance();
                $objUser = User_User::instance();
		return $objDB->selectSimpleField("SELECT users.id FROM users WHERE email = '".$email."' AND users.id != ".$objUser->getIdUser());
        }
        
	public static function checkLoginAndPass($login, $md5password){
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("SELECT id FROM users WHERE name = '".$login."' AND pass = '".$md5password."'");		
	}
	

	/**
	 * Метод возвращает полную информацию о пользователе по его идентификатору
	 *
	 * @return array - массив с информацией о пользователе
	 */
	public function getUserInfo(){
		$objDB = Service_Database::instance();
		$stmtWhere = " WHERE `users`.`id` = '" . $this->idUser ."'";
		//if ($this->login)
			//$stmtWhere = " WHERE `users`.`name` = '" . $this->login ."'";
		$stmt = "SELECT *, users.name AS login FROM users
		LEFT JOIN ".DB_PREFIX."users ON ".DB_PREFIX."users.id_user = users.id 
		" . $stmtWhere;
		$this->arrUserInfo = $objDB->selectOne($stmt);
		return $this->arrUserInfo;
	}
	
	public function getAdmins(){
		$objDB = Service_Database::instance();
		$arrAdmin = $objDB->select("SELECT iduser FROM groups WHERE name = 'admin'");
		return Service_ArrayConverter::getColumn($arrAdmin, "iduser");
	}
	
	

	/**
	 * Проверяет, является ли текущий пользователь админом(admin), редактором(redactor), экспертом(expert) или обычным пользователем.
	 *
	 * @param string $userRole - роль пользователя
	 * @return bool
	 */
	public function checkIfUser($strUserRole) {
		$strUserRole = trim($strUserRole);
		if (!$this->idUser && !$this->login) throw new Exception("Нет номера пользователя или логина. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		if ($this->idUser){
			$arrUser = $objDB->select("SELECT name FROM groups WHERE iduser = ".$this->idUser);
			if (sizeof($arrUser) != 0){
				foreach ($arrUser as $arUser){
					if (strtolower($arUser['name']) == strtolower($strUserRole)) return true;
				}
				return false;
			}
		}
		elseif ($this->login){
			$arrUser = $objDB->select("SELECT groups.name FROM groups LEFT JOIN users ON users.id = groups.iduser WHERE users.name = '".$this->login."'");
			if (sizeof($arrUser) != 0){
				foreach ($arrUser as $arUser){
					if (strtolower($arUser['name']) == strtolower($strUserRole)) return true;
				}
				return false;
			}	
		}
		else return false;
	}
	
	/**
	 * Авторизация пользователя по кукам (login и pass в md5)
	 *
	 * @param text $wrdp
	 * @param text $mygroup
	 * @return (boolean|array)
	 */
	public function loginion($pswrd, $mygroup){
		$auth = $this->getUserInfo();
		if(sizeof($auth) != 0) {
			// проверяем по паролю
			if ($auth['pass']!=$pswrd) {
				return 0;
			} else {
				$objBD = Service_Database::instance();
				$auth_group = $objBD->selectSimpleField("SELECT name FROM groups WHERE name = '".$mygroup."' AND iduser = ".$auth['id']);
				// проверяем по группе
				if ($auth_group != $mygroup) {
					return 0;
				} else {
					$this->idUser = $auth['id'];
					return $auth;
				}
			}
		} else {
			throw new Exception("Ошибка при обращении к базе данных. ", E_USER_ERROR);
		}
	}
	
	/**
	 * Регистрация пользователя
	 * необходимы переменные login pswrd fio email
	 * статус активации аккаунта = 0
	 *
	 */
	public function registrateUser(){
		if ($this->login == NULL) throw new Exception("Нет логина. ", E_USER_ERROR);
		if ($this->email == NULL) throw new Exception("Нет адреса электронной почты. ", E_USER_ERROR);
		if ($this->pswrd == NULL) throw new Exception("Нет пароля. ", E_USER_ERROR);
//		if ($this->fio == NULL) throw new Exception("Нет ФИО пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		$query_user = "insert into users values(
			'',
			'$this->login',
			'$this->pswrd',
			'$this->fio',
			'$this->job',
			'$this->email',
			'$this->phone',
			'$this->url',
			'$this->icq',
			NOW(),
			NOW(),
			0
			)";
		$this->idUser = $objDB->queryInsertAutoincrement($query_user);
		
		if (!$this->idUser) throw new Exception("Не удалось зарегистрировать пользователя. ", E_USER_ERROR);
		
		return $this->idUser;
	}
	
	public function regChangeDataUserWithValidation() {
        $e = new Exception_Multiline();
        $objSession = User_Session::instance();
        
        // email //
		if (trim($this->email) == "") {
			$e[] = "Не указан e-mail";
		}
		if (trim($this->email) != "" && $this->checkEmailFromTableUsersWithoutCurrent($this->email)) {
			$e[] = "К сожалению, данный e-mail уже зарегистрирован. Попробуйте другой";
		}
		if (trim($this->email) != "" && !Service_Mail::parseMail($this->email)) {
			$e[] = "Введите e-mail в виде <i>myname@server.com</i>";
		}
        
        // login //
		if (trim($this->login) == "") {
			$e[] = "Не указан логин";
		}
		if (trim($this->login) != "" && Service_String::strlenUnicode($this->login) > 15) {
			$e[] = "Слишком длинный логин (не больше 15 символов)";
		}
		if (!preg_match("/[0-9a-z_]/i", $this->login) OR preg_match("/[ ]|[а-я]/i",$this->login) ) {
			$e[] = "Логин может состоять только из цифр и букв латинского алфавита";
		}
		if (trim($this->login) != "" && $this->checkLoginWithoutCurrent($this->login)) {
			$e[] = "К сожалению, данный логин уже зарегистрирован. Попробуйте другой";
		}

		// password //
//		if (trim($this->pass1) == "") {
//			$e[] = "Не указан пароль"; 
//		}
        
		if (trim($this->pass1) != "" && $this->pass1 != $this->pass2) {
			$e[] = "Пароли не совпадают";
		}

                // birth day, month, year //
                // может не указываться пользователем
                if (!$this->birthDay_month && !$this->birthDay_day && !$this->birthDay_year){
                        if (!checkdate($this->birthDay_month, $this->birthDay_day, $this->birthDay_year)){
                                $e[] = "Не корректно указана дата рождения";
                        }
                }		
        
		if ($objSession->__get("captcha_keystring") != $this->regKcapthca){
			$e[] = 'Проверочный текст не введен или введен неправильно';
		}
		
		
		if ($e->isErrorExists()) // Если мы зафиксировали какие-то исключения, то выдаем окончательное исключение
			throw $e;
		else { // иначе продолжаем обновление
                        //собираем в массивы обновлений данные, которые были изменены, для обеих таблиц пользователей.
                        
                        $arrDataUsersUpdate = array();
                        $arrDataProjectUsersUpdate = array();
                        
                        if ($this->email != $this->arrUserInfo["email"]) $arrDataUsersUpdate['email'] = $this->email;
                        
                        if ($this->login != $this->arrUserInfo["login"]) $arrDataUsersUpdate['name'] = $this->login;
                        
                        $this->pswrd = md5($this->pass1);
                        
                        if (!empty($this->pass1) && $this->pswrd!=$this->arrUserInfo["pass"])
                        {
                            $arrDataUsersUpdate['pass'] = $this->pswrd;
                        }
			
                        $this->fio = $this->firstName . " " . $this->lastName;
                        if ($this->fio != $this->arrUserInfo["first_name"].' '.$this->arrUserInfo["last_name"])
                        {
                            $arrDataUsersUpdate["fio"] = $this->fio;
                            $arrDataProjectUsersUpdate["first_name"] = $this->firstName;
                            $arrDataProjectUsersUpdate["last_name"] = $this->lastName;
                        }
                        
                        $this->birthDay = $this->birthDay_year."-".$this->birthDay_month."-".$this->birthDay_day;
                        if ($this->birthDay != $this->arrUserInfo["birthDay"])
                        {
                            $arrDataProjectUsersUpdate["birthDay"] = $this->birthDay;
                        }

                        if ($this->country != $this->arrUserInfo["id_country"])
                            $arrDataProjectUsersUpdate['id_country'] = $this->country;
                        
                        if ($this->city != $this->arrUserInfo["id_city"])
                            $arrDataProjectUsersUpdate['id_city'] = $this->city;

                        if ($this->sex != $this->arrUserInfo["sex"])
                            $arrDataProjectUsersUpdate['sex'] = $this->sex;
                        
                        if ($this->phone != $this->arrUserInfo["phone"])
                            $arrDataUsersUpdate['phone'] = $this->phone;
                        
                        if ($this->profession != $this->arrUserInfo["profession"])
                            $arrDataProjectUsersUpdate['profession'] = $this->profession;
                        
                        if ($this->professionExperience != $this->arrUserInfo["profession_experience"])
                            $arrDataProjectUsersUpdate['profession_experience'] = $this->professionExperience."-00-00"; // как дата YYYY-mm-dd

                        $objDB = Service_Database::instance();
                        //изменение общей таблицы пользователей
                        if (!empty($arrDataUsersUpdate))
                        $objDB->update("users", $arrDataUsersUpdate, array("id" => $this->getIdUser()));
                        
                        //изменение таблицы пользователей конкретного проекта
                        if (!empty($arrDataProjectUsersUpdate))
                        $objDB->update(DB_PREFIX."users", $arrDataProjectUsersUpdate, array("id_user" => $this->getIdUser()));

		}
		
		
	}
        
	/**
	 * метод полностью регистрирует пользователя с предварительной валидацией
	 * пользователь добавляется в общую таблицу users, типовую таблицу PROJECT_users и в groups
	 * работает Multiline_Exception
	 * 
	 * необходимые поля:
	 * login
	 * email
	 * pass1
	 * pass2
	 * firstName
	 * lastName
	 * birthDay_day
	 * birthDay_month
	 * birthDay_year
	 * phone
	 * sex
	 * relationshipStatus
	 * city
	 * profession
	 * professionExperience
	 * regConfirmTerms
	 * regKcapthca
	 * 
	 */
	public function regUserWithValidation () {
        $e = new Exception_Multiline();
        $objSession = User_Session::instance();
        
        // email //
		if (trim($this->email) == "") {
			$e[] = "Не указан e-mail";
		}
		if (trim($this->email) != "" && $this->checkEmailFromTableUsers($this->email)) {
			$e[] = "К сожалению, данный e-mail уже зарегистрирован. Попробуйте другой";
		}
		if (trim($this->email) != "" && !Service_Mail::parseMail($this->email)) {
			$e[] = "Введите e-mail в виде <i>myname@server.com</i>";
		}        
        
        // login //
		if (trim($this->login) == "") {
			$e[] = "Не указан логин";
		}
		
		if (trim($this->login) != "" && Service_String::strlenUnicode($this->login) > 15) {
			$e[] = "Слишком длинный логин (не больше 15 символов)";
		}
		
		if (!preg_match("/[0-9a-z_]/i", $this->login) OR preg_match("/[ ]|[а-я]/i",$this->login) ) {
			$e[] = "Логин может состоять только из цифр и букв латинского алфавита";
		}
		
		if (trim($this->login) != "" && $this->checkLogin($this->login)) {
			$e[] = "К сожалению, данный логин уже зарегистрирован. Попробуйте другой";
		}

		// password //
		if (trim($this->pass1) == "") {
			$e[] = "Не указан пароль"; 
		}
        
		if (trim($this->pass1) != "" && $this->pass1 != $this->pass2) {
			$e[] = "Пароли не совпадают";
		}
		
		if (!$this->shortReg){ // в короткой регистрации не учитываем
			
			// first name //
			if (trim($this->firstName) == "") {
				$e[] = "Не указано имя";
			}
	
			// last name //
			if (trim($this->lastName) == "") {
				$e[] = "Не указана фамилия";
			}
	
			// birth day, month, year //
			// может не указываться пользователем
			if (!$this->birthDay_month && !$this->birthDay_day && !$this->birthDay_year){
				if (!checkdate($this->birthDay_month, $this->birthDay_day, $this->birthDay_year)){
					$e[] = "Не корректно указана дата рождения";
				}
			}
			
			if (!$this->regConfirmTerms){
				$e[] = "Вы не согласились с Условиями и Правилами";
			}
		}
        
		if ($objSession->__get("captcha_keystring") != $this->regKcapthca){
			$e[] = 'Проверочный текст не введен или введен неправильно';
		}
		
		
		if ($e->isErrorExists()) // Если мы зафиксировали какие-то исключения, то выдаем окончательное исключение
			throw $e;
		else { // иначе продолжаем регистрацию
			
			$this->pswrd = md5($this->pass1);
                        
			if (!$this->shortReg){
				$this->birthDay = $this->birthDay_year."-".$this->birthDay_month."-".$this->birthDay_day;
				$this->fio = $this->firstName . " " . $this->lastName;
			}
			// регистрация в общую таблицу
			$this->idUser = $this->registrateUser();
			// добавление в группу member
			$this->addUserToGroup("member");
			// регистация в таблицу проекта с сохранением доп данных
			$this->addUserToProjectTable();
			// проводим авторизацию
			$objSession->logIn($this->login, $this->pass1, true);
			
			
		}
		
		
	}
	
	
	/**
	 * Метод сохранеят пользователя в таблицу проекта
	 *
	 * @param array $arrFields - arr $key => $val - набор дополнительных полей для сохранения в PROJECT.users
	 */
	public function addUserToProjectTable($arrFields = array()){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		
		// id канала для чата
		$id_channel = sha1(md5($this->idUser."_".$this->login));

/*		
		if (!is_int($this->city) || !is_numeric($this->city)){
			preg_match("/([0-9А-Яа-я-_]+)( \(([0-9А-Яа-я-_]+)\))?/", $this->city, $arrCity);
			if (isset($arrCity[1])){
				$this->city = $arrCity[1];
				$this->city = $objDB->selectSimpleField("SELECT city_id FROM city WHERE name = '".$this->city."'");
				if (!$this->city) throw new Exception("Не корректно указан город.", E_USER_ERROR);
			}
			elseif (is_string($this->city)){
				$this->city = $objDB->selectSimpleField("SELECT city_id FROM city WHERE name = '".$this->city."'");
				if (!$this->city) throw new Exception("Не корректно указан город.", E_USER_ERROR);
			}
			else $this->city = 4400; // Москва
		}
		$arrCity = $objDB->selectOne("SELECT * FROM city WHERE city_id = ".$this->city);
		$idCountry = $arrCity['country_id'];
		$idRegion = $arrCity['region_id'];
		*/
		
		$idCountry = $this->country;
		$idCity = $this->city;

		// формируем данные для сохранения 
		$arrUpdate = array(
		'id_channel' => $id_channel,
		'birthDay' => $this->birthDay, 
		'first_name' => $this->firstName,
		'last_name' => $this->lastName,
		'id_city' => $this->city, 
		'id_country' => $idCountry,
		'sex' => $this->sex,
		'relationshipStatus' => $this->relationshipStatus,
		'profession' => $this->profession,
		'profession_experience' => $this->professionExperience."-00-00" // как дата YYYY-mm-dd
		
		
		);
		
		// доп поля из переданных переменных для универсальнгости функции
		if (sizeof($arrFields) != 0){
			foreach ($arrFields as $key=>$value){
				$arrUpdate[$key] = $value;
			}
		}
		
		if ($objDB->selectSimpleField("SELECT id_user FROM ".DB_PREFIX."users WHERE id_user = ".$this->idUser)){
			$objDB->update(DB_PREFIX."users", $arrUpdate, array("id_user" => $this->idUser));
		}
		else {
			$arrAdd = $arrUpdate;
			$arrAdd['id_user'] = $this->idUser;
			$objDB->insert(DB_PREFIX."users", $arrAdd);
		}
	}	
	
	/**
	 * метод инициализируе переменные пользователя (login email f/l_name birt_day,month,year и т.д.)
	 * используется для формы регистрации и настройки
	 * 
	 *
	 */
	public function VB_userInit() {
		if ($this->isLoggedIn()){
		
			$birthDay = $this->getUserBirthDay();
			if ($birthDay) {
				$date = date('Y-m-d', strtotime($birthDay));
				$arrDate = getdate(strtotime($date));
				$this->birthDay_day = $arrDate['mday'];
				$this->birthDay_month = $arrDate['mon'];
				$this->birthDay_year = $arrDate['year'];
			}

		}	
	}
	
	
	/**
	 * Добавляем пользователя в группу
	 *
	 * @param string $groupName
	 * @return boolean результат
	 */
	public function addUserToGroup($groupName){
		$objDB = Service_Database::instance();
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		if ($objDB->selectSimpleField("SELECT iduser FROM groups WHERE iduser = ".$this->idUser." AND name = '".$groupName."'")) 
			throw new Exception("Пользователь уже состоит в группе '".$groupName."'", E_USER_ERROR);
		return $objDB->insert("groups", array('iduser' => $this->idUser, 'name' => $groupName));	
	}
	

	public function addUserContactDetails($arrFields = array()){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		$objDB->update("users", 
			array('fio' => $this->fio, 'phone' => $this->phone, 'url' => $this->url, 'icq' => $this->icq),
			array('id' => $this->idUser)
		);
		
		if (!is_int($this->city) || !is_numeric($this->city)){
			preg_match("/([0-9А-Яа-я-_]+)( \(([0-9А-Яа-я-_]+)\))?/", $this->city, $arrCity);
			if (isset($arrCity[1])){
				$this->city = $arrCity[1];
				$this->city = $objDB->selectSimpleField("SELECT city_id FROM city WHERE name = '".$this->city."'");
				if (!$this->city) throw new Exception("Не корректно указан город.", E_USER_ERROR);
			}
			elseif (is_string($this->city)){
				$this->city = $objDB->selectSimpleField("SELECT city_id FROM city WHERE name = '".$this->city."'");
				if (!$this->city) throw new Exception("Не корректно указан город.", E_USER_ERROR);
			}
			else $this->city = 4400; // Москва
		}
		$arrCity = $objDB->selectOne("SELECT * FROM city WHERE city_id = ".$this->city);
		$idCountry = $arrCity['country_id'];
		$idRegion = $arrCity['region_id'];
		
		$arrUpdate = array('date_roz' => $this->birthDay, 'id_city' => $this->city, 'id_country' => $idCountry, 'id_region' => $idRegion);
		
		if (sizeof($arrFields) != 0){
			foreach ($arrFields as $key=>$value)
				$arrUpdate[$key] = $value;
		}
		
		if ($objDB->selectSimpleField("SELECT id_user FROM ".DB_PREFIX."users WHERE id_user = ".$this->idUser)){
			$objDB->update(DB_PREFIX."users", $arrUpdate, array("id_user" => $this->idUser));
		}
		else {
			$arrAdd = $arrUpdate;
			$arrAdd['id_user'] = $this->idUser;
			$objDB->insert(DB_PREFIX."users", $arrAdd);
		}
	}
	
	/**
	 * Функция возвращает список всех пользователей проекта
	 *
	 * @param int $pageNum
	 * @return array
	 */
	public function getUsersList($pageNum = 0){
		$objDB = Service_Database::instance();
		
		$stmt = "SELECT COUNT(id_user) AS users_count FROM ".DB_PREFIX."users";
		$this->setItemCount($objDB->selectSimpleField($stmt));
	
		$stmt = "
		SELECT  ".DB_PREFIX."users.id_user,
				".DB_PREFIX."users.date_roz,
				".DB_PREFIX."users.id_country,
				".DB_PREFIX."users.id_city,
				".DB_PREFIX."users.id_region,
				".DB_PREFIX."users.skype,
				".DB_PREFIX."users.magent,
				users.last_time,
				TIMESTAMPDIFF(MINUTE, users.last_time, NOW()) as ts,
				users.fio,
				users.email,
				users.id,
				users.name,
				users.job,
				users.phone,
				users.icq,
				users.time			
		FROM ".DB_PREFIX."users
		LEFT JOIN users ON users.id = ".DB_PREFIX."users.id_user
		ORDER BY ts ASC
		" . $this->makeLimits($pageNum);
//		echo $stmt;
		return $objDB->select($stmt);
	}

	public function getUsersSearchList($pageNum, $arrSearch){
		$fio = $arrSearch['fio'] ? $arrSearch['fio'] : '';
		$isOnline = $arrSearch['online'] ? 1 : 0;
		$isOffline = $arrSearch['offline'] ? 1 : 0;
		$allStatus = $arrSearch['allStatus'] ? 1 : 0;
		$idCity = $arrSearch['city_id'] ? $arrSearch['city_id'] : 'all';
		$idCountry = $arrSearch['country_id'] ? $arrSearch['country_id'] : 'all';
		
		if (!$isOffline && !$isOnline) $allStatus = 1;
		
//		print_r($arrSearch); 

		$objDB = Service_Database::instance();
		
		$stmtWhere = "WHERE 1 ";
		if ($fio){
			$stmtWhere .= "AND ( LOWER(users.fio) LIKE '%".$fio."%'  
							OR LOWER(users.fio) LIKE '".$fio."%') ";			
		}
		if (!$allStatus){
			$stmtWhere .= "
						AND TIMESTAMPDIFF(MINUTE, users.last_time, NOW()) ".($isOnline ? "<" : ">")." 30 "; // 30 минут
		}
		if ($idCountry && $idCountry != 'all'){
			$stmtWhere .= "
						AND ".DB_PREFIX."users.id_country = ".$idCountry." ";
		}
		if ($idCity && $idCity != 'all'){
			$stmtWhere .= "
						AND ".DB_PREFIX."users.id_city = ".$idCity." ";
		}
		
		$stmt = "   SELECT COUNT(id_user) 
					FROM ".DB_PREFIX."users 
					LEFT JOIN users ON users.id = ".DB_PREFIX."users.id_user ".$stmtWhere;
		$this->setItemCount($objDB->selectSimpleField($stmt));
	
		$stmt = "
		SELECT  ".DB_PREFIX."users.id_user,
				".DB_PREFIX."users.date_roz,
				".DB_PREFIX."users.id_country,
				".DB_PREFIX."users.id_city,
				".DB_PREFIX."users.id_region,
				".DB_PREFIX."users.skype,
				".DB_PREFIX."users.magent,
				users.last_time,
				IF( TIMESTAMPDIFF( MINUTE, users.last_time, NOW()) > '30', '31', '29') AS ts,
				users.fio,
				users.email,
				users.id,
				users.name,
				users.job,
				users.phone,
				users.icq,
				users.time			
		FROM ".DB_PREFIX."users
		LEFT JOIN users ON users.id = ".DB_PREFIX."users.id_user
		" . $stmtWhere . " 
		ORDER BY ts, users.fio
		" . $this->makeLimits($pageNum);
//		echo $stmt;
		return $objDB->select($stmt);		
		
	}
	
	/**
	 * Метод подготавливает список пользователей для добавления / удаления групп 
	 * группы - права доступа 
	 *
	 * @param unknown_type $arrUsers
	 */
	public function getUsersForGroupSets($arrUsers){
		$size = sizeof($arrUsers);
		$objDB = Service_Database::instance();
		
		if ($size){
			for ($i=0;$i<$size;$i++){
			
				$arrUsers[$i]["groupsTemp"] = Service_ArrayConverter::getColumn($objDB->select("SELECT name FROM groups WHERE iduser = ".$arrUsers[$i]["id_user"]), "name");
				
				foreach ($this->arrUsersGroups as $group){
					if (in_array($group, $arrUsers[$i]["groupsTemp"], false)){
						
						$arrUsers[$i]["groups"][$group] = 1;
					}
					else $arrUsers[$i]["groups"][$group] = 0;
				}
				unset($arrUsers[$i]["groupsTemp"]);
			}
		}
		
		return $arrUsers;
	}
	
	/**
	 * получаем id всех пользователей данного проекта (определяеся по DB_PREFIX)
	 * должна быть таблица DB_PREFIX users
	 */
	public static function getAllUsersId(){
		$objDB = Service_Database::instance();		
	  	$stmt = "
	  	SELECT `users`.`id`
	  	FROM `users`
	  	LEFT JOIN ".DB_PREFIX."users ON ".DB_PREFIX."users.id_user = users.id";
		return $objDB->selectSimpleArray($stmt);
	}
	
	
	/**
	 * Функция возвращает число друзей пользователя
	 *
	 * @return int
	 */
	public function getUserFriendsCount(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("select count(id) from ".DB_PREFIX."friends_pair where id_one=".$this->idUser." OR id_second=".$this->idUser);
	}
	
	/**
	 * Функция возвращает всех друзей онлайн
	 *
	 * @return array
	 */
	public function getUserFriendsOnline(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		
		return $objDB->select(
		"SELECT *, users.id as id_user, COUNT(".DB_PREFIX."sami_user_mes.text_value) AS newMessagesCount
		FROM ".DB_PREFIX."friends_pair 
		LEFT JOIN users ON ".DB_PREFIX."friends_pair.id_second = users.id
		LEFT JOIN ".DB_PREFIX."sami_user_mes ON ".DB_PREFIX."sami_user_mes.id_ot_kogo = ".DB_PREFIX."friends_pair.id_second
		AND ".DB_PREFIX."sami_user_mes.mes_status='n' 
		AND ".DB_PREFIX."sami_user_mes.id_komu = ".$this->idUser." 
		WHERE TIMESTAMPDIFF(MINUTE, users.last_time, NOW()) < 30 
		AND ".DB_PREFIX."friends_pair.id_one = ".$this->idUser."
		GROUP BY(".DB_PREFIX."friends_pair.id_second)");
	}
	
	/**
	 * Функция возвращает всех друзей оффлайн (разница в 30 мин)
	 *
	 * @return array
	 */
	public function getUserFriendsOffline(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		
		return $objDB->select( 
		"SELECT *, users.id as id_user, COUNT(".DB_PREFIX."sami_user_mes.text_value) AS newMessagesCount
		FROM ".DB_PREFIX."friends_pair 
		LEFT JOIN users ON ".DB_PREFIX."friends_pair.id_second = users.id
		LEFT JOIN ".DB_PREFIX."sami_user_mes ON ".DB_PREFIX."sami_user_mes.id_ot_kogo = ".DB_PREFIX."friends_pair.id_second
		AND ".DB_PREFIX."sami_user_mes.mes_status='n' 
		AND ".DB_PREFIX."sami_user_mes.id_komu = ".$this->idUser." 
		WHERE TIMESTAMPDIFF(MINUTE, users.last_time, NOW()) > 30 
		AND ".DB_PREFIX."friends_pair.id_one = ".$this->idUser."
		GROUP BY(".DB_PREFIX."friends_pair.id_second)");
	}	
	
	/**
	 * Функция возвращает всех друзей с разницей от времени входа в минутах в поле ts
	 *
	 * @return array
	 */
	public function getUserFriends($pageNum = 0){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		$this->setItemCount($this->getUserFriendsCount());
		return $objDB->select( 
		"SELECT *, TIMESTAMPDIFF(MINUTE, users.last_time, NOW()) AS ts, users.id as id_user
		FROM ".DB_PREFIX."friends_pair 
		LEFT JOIN users ON ".DB_PREFIX."friends_pair.id_second = users.id
		WHERE id_one = ".$this->idUser." ".
		$this->makeLimits($pageNum));
	}
	
	public function deleteFriends($arrFriends){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		if (sizeof($arrFriends) != 0){
			foreach ($arrFriends as $idFriend){
				if (is_numeric($idFriend)){
					$objDB->delete(DB_PREFIX."friends_pair", array("id_one" => $this->idUser, "id_second" => $idFriend));
					$objDB->delete(DB_PREFIX."friends_pair", array("id_second" => $this->idUser, "id_one" => $idFriend));					
				}
			}
		}
	}
	
	public function getUserAvatar($width = 240, $rnd = false){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		$text = "";
		if ($rnd) $text = "?rnd=".rand(0, 100000);
		if (file_exists(IMAGES."avatars/x_".$this->idUser.".jpg")){
			return '<a href="'.W_ABSPATH.'profile/'.$this->idUser.'"><img src="'.W_IMAGES.'avatars/x_'.$this->idUser.'.jpg'.$text.'" alt="" title="" width="'.$width.'"/></a>';
		}
		else return '<a href="'.W_ABSPATH.'profile/'.$this->idUser.'"><img src="'.W_IMAGES.'avatars/x_no_avatar.jpg" alt="" title="" width="'.$width.'"/></a>';
	}
	
	public function getUserChatAvatar($idUser){
		if ($idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		
		$chat_avatar = IMAGES."avatars/chat_$idUser.jpg";
		if (!file_exists($chat_avatar)) $chat_avatar = W_IMAGES."avatars/chat_no_avatar.jpg";
		else $chat_avatar = W_IMAGES."avatars/chat_$idUser.jpg";
		
		return $chat_avatar;
	}
	
	public function getUserEmail($login){
		if (!$login) throw new Exception("Нет логина пользователя. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("SELECT email FROM users WHERE name = '".$login."'");
	}
	
	/**
	 * получение login пользователя по email
	 *
	 */
	public function getUserLoginByEMail($eMail){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `users`.`name`
		FROM `users`
		WHERE `users`.`email` = '" . $eMail . "'";
		return $objDB->selectSimpleField($stmt);
	}
	
	public static function getUserLogin($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `users`.`name`
		FROM `users`
		WHERE `users`.`id` = '" . $idUser . "'";
		return $objDB->selectSimpleField($stmt);
	}	

	/**
	 * Получает идентификатор пользователя по его логину
	 *
	 * @param string $login
	 * @return integer
	 */
  public static function getUserIdByLogin($login){
    $objDB = Service_Database::instance(); // Получаем подключение к БД
    $stmt = "SELECT `id` FROM users WHERE `name` = '" . $login . "'";  // формируем SQL-запрос
    return $objDB->selectSimpleField($stmt);  // Осуществляем SQL-запрос
  }	
  
	/**
	 * получение id пользователя по email
	 *
	 */
	public static function getUserIdByEMail($eMail){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `users`.`id`
		FROM `users`
		WHERE `users`.`email` = '" . $eMail . "'";
		return $objDB->selectSimpleField($stmt);
	} 
	
	///////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * Функция возвращает ФИО пользователя
	 *
	 * @param int $objUser->idUser
	 * @return text
	 */
	private function _getUserFIO(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);	
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("SELECT users.fio FROM users WHERE users.id = ".$this->idUser);
	}
	
	private function _getUserBirthDay(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);	
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("SELECT birthDay FROM ".DB_PREFIX."users WHERE id_user = ".$this->idUser);		
	}
	
	private function _getUserCity(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);	
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("
			SELECT name FROM city
			LEFT JOIN ".DB_PREFIX."users ON ".DB_PREFIX."users.id_city = city.city_id
			WHERE ".DB_PREFIX."users.id_user = ".$this->idUser);
	}
	
	private function _getUserCountry(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);	
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField("
			SELECT name FROM country
			LEFT JOIN ".DB_PREFIX."users ON ".DB_PREFIX."users.id_country = country.country_id
			WHERE ".DB_PREFIX."users.id_user = ".$this->idUser);
	}		
	
	/**
	 * Функция обновляет поле users.last_time
	 *
	 * @param int $objUser->idUser
	 * @return boolean
	 */
	public function updateUserLastImpressAndCookie(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);	
		$objDB = Service_Database::instance();
		$objDB->query("UPDATE users SET last_time = NOW() WHERE id = ".$this->idUser);
//		$count_ = isset($_COOKIE["cur_count"]) ? absolutelyEscapeString($_COOKIE["cur_count"]) : 0;
//		$count_++;
//		setcookie ("cur_count", $count_, time() + 3600*24*2);
		return true;
	}
	
	public function updateUserPass(){
		if ($this->idUser == NULL) throw new Exception("Нет номера пользователя. ", E_USER_ERROR);
		if ($this->pswrd == NULL) throw new Exception("Нет пароля. ", E_USER_ERROR);
		$objDB = Service_Database::instance();
		$objDB->update("users", array("pass" => $this->pswrd), array("id" => $this->idUser));
	}
	
	/**
	 * сохраняем дату когда пользователь был на сайте
	 *
	 */
	public static function upadteLastImpression($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `users`
		SET `last_time` = NOW()
		WHERE `users`.`id` = " . $idUser;
		return $objDB->query($stmt);
	}	
	
	/**
	 * Устанавливает ремя последнего входа
	 *
	 */
	public static function setLoginTime(){
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `users`
    				 SET  `login_time` = '" . Service_Date::gLocalTime2BD() . "'
    				 WHERE `users`.`id` = '" . $userId . "'";
		return $objDB->query($stmt);
	}	
	
	/**
	 * Добавляет +1 к посещениям пользователя
	 *
	 */
	public static function addVisit(){
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `users`
    				SET  `visits` = (`visits`+1)
    				WHERE `users`.`id` = '" . $userId . "'";
		return $objDB->query($stmt);
	}	
	
	/**
	 * Устанавливает татус присутствия пользователя на сайте
	 *
	 */
	public static function setStatus($status, $userId){
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		if (!$userId)
		  $userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `users`
    				SET  `user_status` = '" . $status . "'
    				WHERE `users`.`id` = '" . $userId . "'";
	  return $objDB->query($stmt);
	}
	
/**
	 * Добавляет +1 к хитам пользователя
	 *
	 */
	public static function addHit(){
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if(!$userId)
		  return NULL;
	  $stmt = "UPDATE `users`
    				SET  `hits` = (`hits`+1)
    				WHERE `users`.`id` = '" . $userId . "'";
		return $objDB->query($stmt);
	}

	
	
  /**
   * Метод возвращает сообщение, которое следует вывести пользователю
   *
   * @return string
   */
  public static function getUserMessage() {
    return isset(self::$userMessage) ? self::$userMessage : NULL;
  }
  
  /**
   * Метод возвращает тип сообщения, которое следует вывести пользователю
	 * <0 - сообщение об ошибке
	 * 0 - нет сообщения
	 * >0 - сообщение об успехе
   * @return integer
   */
  public static function getUserMessageType() {
    return isset(self::$userMessageType) ? self::$userMessageType : 0;
  }
  /**
   * Метод устанавливает сообщение, которое следует вывести пользователю
   *
   * @param string $message
   * @param integer $messageType
   */
	public static function setUserMessage($message, $messageType = -1) {
	  self::$userMessage = $message;
	  self::$userMessageType = $messageType;
	}
  /**
   * Метод удаляет сообщение, которое следует вывести пользователю
   *
   */
	public static function deleteUserMessage() {
	  self::$userMessage = NULL;
	  self::$userMessageType = 0;
	}
	
	
	public function setUserGroup($idUser, $group, $issetInGroup = false) {
		$objDB = Service_Database::instance();
		
		$res = false;
		if ($issetInGroup) {
			$res = $objDB->insert("groups", array("name" => $group, "iduser" => $idUser));
		}else {
			$res = $objDB->delete("groups", array("name" => $group, "iduser" => $idUser));
		}
		
		return $res;
	}
	
	/**
	 * Метод сохраняет в таблице пользователя (DB_PREFIX_users) информацию о том
	 * что он загрузил фотку и выбрал аватраку
	 *
	 */
	public function saveUserAvatarToDB(){
		if ($this->isLoggedIn()){
			$objDB = Service_Database::instance();
			$objDB->update(DB_PREFIX."users", array("id_avatar" => $this->idUser), array("id_user" => $this->idUser));
		}
	}

	/**
	 * Сохраняет время послденего просмотра пользователем сущности
	 *
	 * @param int $idEssence
	 * @param int $essenceType
	 * @return bool
	 */
	public static function updateLastEssenceImpression($idEssence, $essenceType){
		$objDB = Service_Database::instance();
		$objSesion = User_Session::instance();
		$idUser = $objSesion->getUserId();
		$essenceType = Service_Essence::getEssenceTypeID($essenceType);
		$stmt = " SELECT `".DB_PREFIX."user_essence_last_impress_time`.`id_user`
							FROM `".DB_PREFIX."user_essence_last_impress_time`
							WHERE `".DB_PREFIX."user_essence_last_impress_time`.`id_user`=".$idUser."
							AND `".DB_PREFIX."user_essence_last_impress_time`.`id_essence`=".$idEssence."
							AND `".DB_PREFIX."user_essence_last_impress_time`.`essence_type`=".$essenceType;

		if (!$objDB->isRecordExist($stmt))
			return $objDB->insert(DB_PREFIX.'user_essence_last_impress_time', array('id_user'=>$idUser, 'id_essence'=>$idEssence, 'essence_type'=>$essenceType, 'impress_time'=>Service_Date::gLocalTime2BD()));
		else
			return $objDB->update(DB_PREFIX.'user_essence_last_impress_time', array('impress_time'=>Service_Date::gLocalTime2BD()), array('id_user'=>$idUser, 'id_essence'=>$idEssence, 'essence_type'=>$essenceType));
	}

	public static function getLastEssenceImpression($idEssence, $essenceType){
		$objDB = Service_Database::instance();
		$objSesion = User_Session::instance();
		$idUser = $objSesion->getUserId();
		$essenceType = Service_Essence::getEssenceTypeID($essenceType);
		$stmt = " SELECT `".DB_PREFIX."user_essence_last_impress_time`.`impress_time`
							FROM `".DB_PREFIX."user_essence_last_impress_time`
							WHERE `".DB_PREFIX."user_essence_last_impress_time`.`id_user`=".$idUser."
							AND `".DB_PREFIX."user_essence_last_impress_time`.`id_essence`=".$idEssence."
							AND `".DB_PREFIX."user_essence_last_impress_time`.`essence_type`=".$essenceType;
	 return $objDB->selectSimpleField($stmt);
	}	
	
	/**
	 * Метод добавляет инфу пользователю о его голосовании poll +/-
	 *
	 * @param unknown_type $markType
	 */
	public static function addEventAddMarkToUserTable($markType){
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		switch ($markType){
			case 0: $field = '`set_mark_amount`'; break;
			case 1: $field = '`difficulty_mark_amount`'; break;
			case 3: $field = '`voting_amount`'; break;
		}

		$stmt = "
		UPDATE `".DB_PREFIX."users`
		SET " . $field . " = (" . $field . "+1)
		WHERE `".DB_PREFIX."users`.`id_user` = " . $idUser;
		$objDB->query($stmt);
	}
	
	/**
	 * получение id пользователя по id и essence type сущности
	 *
	 */
	public static function getUserIdByEssence($idEssence, $essenceType){
		$objDB = Service_Database::instance();
		$essenceName = Service_Essence::getEssenceTypeName($essenceType);
		$essenceIdField = Service_Essence::getEssenceIdFieldName($essenceType);
			$stmt = "
			SELECT `" . DB_PREFIX.$essenceName . "`.`id_user`
			FROM `" . DB_PREFIX.$essenceName . "`
			WHERE `" . DB_PREFIX.$essenceName . "`.`" . $essenceIdField . "` = " . $idEssence;
		return $objDB->selectSimpleField($stmt);
	}


	/**
	 * получаем рейтинг пользователя
	 */
	static function getUserRating($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `".DB_PREFIX."users`.`rating`
		FROM `".DB_PREFIX."users`
		WHERE `".DB_PREFIX."users`.`id_user` = " . $idUser;
		return $objDB->selectSimpleField($stmt);
	}	
	
	
	/**
	 * Запускается полсе определения переменной idUser
	 *
	 */
	private function userStart() {

		// 1 Проверка на админа
		$this->isAdmin = $this->checkIfUser("admin");
		
		// 2 Проверка аутентификации
		if ($this->idUser != NULL && $this->login != NULL && $this->pswrd != NULL) {
			if ($this->checkLoginAndPass($this->login, $this->pswrd)) {
				$this->loggedIn = true;
			}
		}
		
		// 4 проверка, онлайн юзер или нет
		$objDB = Service_Database::instance();
		if ($objDB->selectSimpleField("SELECT TIMESTAMPDIFF(MINUTE, users.last_time, NOW()) FROM users WHERE id = $this->idUser") < 30) {
			$this->isOnline = true;
		}
		else $this->isOnline = false;
		
		// 4 Получение данных пользователя
//		$arrUserInfo = $this->getUserInfo();
//		$this-> 
	}
	
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


	/**
	 * получаем никнейм пользователя по id
	 *
	 */
	public static function getLoginById($idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`login`
		FROM `user`
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->selectSimpleField($stmt);
	}


	/**
	 * получение email пользователя по id
	 *
	 */
	public static function getUserEMailByID($idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`e_mail`
		FROM `user`
		WHERE `user`.`ID_user` = '" . $idUser . "'";
		return $objDB->selectSimpleField($stmt);
	}



	/**
	 * получаем e-mail'ы всех пользователей
	 */
	public static function getAllMails() {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`e_mail`
		FROM `user`";
		return $objDB->selectSimpleArray($stmt);
	}


	public function getCountMessages($ID_user) {
		$objDB = Service_Database::instance();
		$stat = "SELECT COUNT(`message`.`ID_user_to`) AS countMessage
		         FROM `message`
		         WHERE `message`.`reading_date` IS NULL AND `message`.`ID_user_to`='" . $ID_user . "'";
		$messageCount = $objDB->select($stat);
		return $messageCount[0]['countMessage'];
	}


	/**
	 * Получаем имя пользователя по идентификатору
	 *
	 * @param int $idUser
	 * @return string
	 */
	public static  function getUserNameById($idUser) {//автор Горбачев Максим
		$objDB = Service_Database::instance();
		$stmt="
		SELECT `user`.`first_name`,
					 `user`.`last_name`,
					 `user`.`login`
	  FROM `user`
	  WHERE `user`.`ID_user` = " . $idUser;
		$arrUser = $objDB->selectOne($stmt);
    if (isset($arrUser['first_name']) or isset($arrUser['last_name']))
            $fullUserName = $arrUser['last_name'] . ' ' . $arrUser['first_name'] . ' (' . $arrUser['login'] . ')';
    else $fullUserName = $arrUser['login'];
		return $fullUserName;
	}

	public static function getUserForUserMenu($idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`first_name`,
						`user`.`last_name`,
						`user`. `pic_path`
		FROM `user`
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->selectOne($stmt);
	}


	/**
	 * функция для вставки информации из профайла пользователя
	 *
	 */
	public static function saveEditProfile($arrUser, $oldPass) {
		$arrUser['sex'] == 2 ? $sex = "NULL" : $sex = "'" . $arrUser['sex'] . "'";
		if (!empty($arrUser['password']))
			$md5Pass = md5($arrUser['password']);
		self::checkUser($arrUser);
		$stmtSet = "`birthday` = '" . $arrUser['birthday'] . "',
								`education` = '" . $arrUser['education'] . "',
								`hobby` = '" . $arrUser['hobby'] . "',
								`lat` = '" . $arrUser['lat'] . "',
								`lng` = '" . $arrUser['lng'] . "',
								`profession` = '" . $arrUser['profession'] . "',
								`first_name` = '" . $arrUser['firstName'] . "',
								`last_name` = '" . $arrUser['lastName'] . "',
								`site_name` = '" . $arrUser['siteName'] . "',
								`objective` = '" . $arrUser['objective'] . "',
								`site_url` = '" . $arrUser['siteUrl'] . "',
								`professional_aim` = '" . $arrUser['professional_aim'] . "',
								`skills` = '" . $arrUser['skills'] . "',
								`specialization` = '" . $arrUser['specialization'] . "',
								`sex` = " . $sex . ",
								`country` = " . $arrUser['country'] . ",
								/*`time_zone` = " . $arrUser['timeZone'] . ",*/
								`city` = '" . $arrUser['city'] . "'" . (!empty($arrUser['password']) ? ", `pass` = '" . $md5Pass . "'" : NULL);
	  if (isset($arrUser['image']) and $arrUser['delPhoto'] != 'on')
      $stmtSet .= ", `pic_path`='" . $arrUser['image']->getImageExtension() . "'";
    elseif ($arrUser['delPhoto'] == 'on')
    	$stmtSet .= ", `pic_path`=''";
		$objDB = Service_Database::instance();
		$stmt = "
    UPDATE `user` SET " . $stmtSet . "
    WHERE `user`.`ID_user` = '" . $arrUser['idUser'] . "'";
		$objDB->query($stmt);
	  $idUser = $arrUser['idUser'];
	  if (isset($arrUser['image'])) {
		  $image = $arrUser['image'];
		  $image->setGoalFolder(IMAGES . 'pictures/user/');
	    $image->setNewImageName($idUser);
	    $image->saveExistingFile();
	    $image->createImageFromFile('b_', 100, 100);
	    $image->createImageFromFile('m_', 80, 80);
	    $image->createImageFromFile('s_', 60, 60);
	    $image->createImageFromFile('vs_', 30, 30);
	  }
	  if (!empty($arrUser['password']) AND $oldPass != $md5Pass)
	    Service_Notification::sendNotificationPass($arrUser['idUser'], $arrUser['password']);
		return true;
	}

	public static function getUsersToAutocomplete($g) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`last_name`
		FROM `user`
		WHERE `user`.`last_name` = ";
		return $objDB->select($stmt);
	}

	/**
	 * функция для проверки получаемых данных в профайл пользователя
	 *
	 * @param unknown_type $arrUser
	 * @return unknown
	 */
	public static function checkUser($arrUser) {
	 $e = Exception_Form::instance(); //создаем объект для хранения списка исключений
   if (isset($arrUser['imageErr'])) {
     $e->addException('image', $arrUser['imageErr']);
   }

   if ($e->isErrorExists()) // Если мы зафиксировали какие-то исключения, то выдаем окончательное исключение
      throw $e;
  return true;
	}


	public static function getAutosugestLogin($q) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`login`
		FROM `user`
		WHERE `user`.`login` LIKE '" . $q . "%'";
		return $objDB->select($stmt);
	}

	/**
	 * функция для получния информации о пользователе в профайл
	 *
	 * @param unknown_type $idUser
	 * @return unknown
	 */
	public static function getProfileInfo($login) {
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$stmt = "
		SELECT `user`.`ID_user`,
					 `user`.`first_name`,
					 `user`.`last_name`,
					 `user`.`login`,
					 `user`.`lat`,
					 `user`.`lng`,
					 `user`.`pic_path`,
					 `user`.`time_zone`,
					 `user`.`average_mark`,
					 `user`.`sex`,
					 `user`.`birthday`,
					 `user`.`education`,
					 `user`.`hobby`,
					 `user`.`hits`,
					 `user`.`rating`,
					 `user`.`professional_aim`,
					 `user`.`skills`,
					 `user`.`specialization`,
					 `user`.`money`,
					 `user`.`site_name`,
					 `user`.`user_status`,
					 `user`.`site_url`,
					 `user`.`visitors`,
					 `user`.`browsing_amount`,
					 `user`.`visits`,
					 `user`.`profession` AS `ID_profession`,
					 `user`.`city`,
					 `user`.`country`,
					 `user`.`objective`,
					 `user`.`comment_amount`,
					 `user`.`registration`,
					 `user`.`question_amount`,
					 `user`.`pass`,
					 `user`.`answer_amount`,
					 `user`.`community_amount`,
					 `user`.`lesson_amount`,
					 `user`.`article_amount`,
					 `user`.`solution_amount`,
					 `user`.`last_impression`,
					 `user`.`voting_amount`,
					 `user`.`difficulty_mark_amount`,
					 `user`.`rating_place`,
					 `user`.`set_mark_amount`,
					 `user`.`friends_request_amount`,
					 `user`.`friends_amount`,
					 `user`.`vk_id`,
					 `mark`.`mark`,
					 `profession`.`name` AS `profession`,
					 `country`.`name` AS `country_name`,
					 `country`.`alpha2` AS `flag`,
					 `city`.`name` AS `city_name`,
					 `work_search`.`tags`,
					 `work_search`.`price`,
					 `work_search`.`show_price_flag`,
					 `work_search`.`search_flag`,
					 `work_search`.`search_flag_creation`
		FROM `user`
		LEFT JOIN `mark` ON `mark`.`ID_essence`=`user`.`ID_user` AND
							`mark`.`essence_type`=3 AND `mark`.`ID_user`='" . $objSession->getUserId() . "'
		LEFT JOIN `country` ON `user`.`country` = `country`.`ID_country`
		LEFT JOIN `city` ON `user`.`city` = `city`.`ID_city`
		LEFT JOIN `profession` ON `user`.`profession` = `profession`.`ID_profession`
		LEFT JOIN `work_search` ON `work_search`.`ID_work_search` = `user`.`ID_user`
		WHERE `user`.`login` = '" . $login . "'";
		return $objDB->selectOne($stmt);
	}

	/**
	 * получаем пользователей с наибольшим рейтингом
	 */
	public static function getPopUsers($limit = NULL) {
		!empty($limit) ? $limit = " LIMIT " . $limit : NULL;
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`ID_user`,
					 `user`.`first_name`,
					 `user`.`last_name`,
					 `user`.`pic_path`,
					 `user`.`rating`,
					 `user`.`comment_amount`,
					 `user`.`average_mark`,
					 `profession`.`name` AS `profession`,
					 `country`.`alpha2` AS `flag`
		FROM `user`
		LEFT JOIN `country` ON `user`.`country` = `country`.`ID_country`
		LEFT JOIN `profession` ON `user`.`profession` = `profession`.`ID_profession`
		ORDER BY `user`.`rating` DESC" . $limit;
		return $objDB->select($stmt);
	}



	/**
	 * функция для получения всех стран
	 *
	 * @return unknown
	 */
	public static function getAllCountry() {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `country`.`ID_country`, `country`.`name`
		FROM `country`
		ORDER BY `country`.`name` ASC";
		return $objDB->select($stmt);
	}

	/**
	 * функция для получения всех стран
	 *
	 */
	public static function getFirstCountry() {
		$objDB = Service_Database::instance();
		$stmt = "
			SELECT `country`.`ID_country`, `country`.`name`
			FROM `country`
			ORDER BY `country`.`count` DESC
			LIMIT 10";
		return $objDB->select($stmt);
	}


	/**
	 * функция для получения городов опредеенной страны
	 *
	 * @param unknown_type $idCountry
	 * @return unknown
	 */
	public static function getAllCity($idCountry) {
		if ($idCountry != NULL) {
			$objDB = Service_Database::instance();
			$stmt = "
			SELECT `city`.`ID_city`, `city`.`name`
			FROM `city`
			WHERE `city`.`ID_country` = '" . $idCountry . "'
			ORDER BY `city`.`name` ASC";
			return $objDB->select($stmt);
		}
		else
			return NULL;
	}

	/**
	 * получем город по id
	 */
	public static function getCityNameById($idCity) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `city`.`name`
		FROM `city`
		WHERE `city`.`ID_city` = " . $idCity . "
		LIMIT 1";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * функция для получения самых популярных городов опредеенной страны
	 *
	 */
	public static function getFirstCity($idCountry) {
		if ($idCountry != NULL) {
			$objDB = Service_Database::instance();
			$stmt = "
			SELECT `city`.`ID_city`, `city`.`name`
			FROM `city`
			WHERE `city`.`ID_country` = " . $idCountry . "
			ORDER BY `city`.`count` DESC
			LIMIT 11";
			return $objDB->select($stmt);
		}
		else
			return NULL;
	}

	/**
	 * получаем список профессий
	 *
	 * @return unknown
	 */
	public static function getAllProfessions() {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `profession`.`name`,
					 `profession`.`ID_profession`
		FROM `profession`";
		return $objDB->select($stmt);
	}



	/**
	 * получаемый 3 рутовых раздела с наибольшим рейтингом для пользовательского меню
	 */
	public static function getRatingRootFolderForUserMenu($idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `folder_rating`.`place`,
					 `folder_rating`.`ID_folder`,
					 `folder_rating`.`recount_temp_rating`,
					 `folder`.`name`
		FROM `folder`
		LEFT JOIN `folder_rating` ON `folder_rating`.`ID_folder` = `folder`.`ID_folder`
		WHERE `folder`.`ID_root_folder` IS NULL AND `folder_rating`.`ID_user` = " . $idUser . "
  	GROUP BY `folder`.`ID_folder`
		ORDER BY `folder_rating`.`recount_temp_rating` DESC
		LIMIT 3";
		return $objDB->select($stmt);
	}

	/**
	 * получаем профессию пользователя
	 *
	 * @param unknown_type $idUser
	 */
	/*public static function getUserProfession($idUser) {
		$objDB = Service_Database::instance();
		$stmt ="
		SELECT `profession`.`name`
		LEFT JOIN `profession` ON `user`.`profession` = `profession`.`ID_profession`
		FROM `professin`";
		return $objDB->selectSimpleField($stmt);
	}*/

	/**
	 * Метод устанавливает нулевой статус всем пользователям, которые не присутствуют на сайте уже 15 минут
	 *
	 */
	public static function setZeroStatusByTimeOut()  {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="
		UPDATE `user`
    LEFT JOIN `session` ON `session`.`ID_user` = `user`.`ID_user`
    SET  `user_status` = 0
    WHERE ((`session`.`last_impression` IS NULL) OR (`session`.`last_impression` < DATE_SUB(now(), INTERVAL 15 MINUTE))) AND `user_status` > 0;";
		return $objDB->query($stmt);
	}

	/**
	 * уменьшаем число пользователей с указаным городом
	 */
	public static function decrementCity($idCity) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `city` SET `count` = (`count` - 1)
		WHERE `city`.`ID_city` = " . $idCity;
		return $objDB->query($stmt);
	}

	/**
	 * увеличиваем число пользователей с указаным городом
	 */
	public static function incrementCity($idCity) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `city` SET `count` = (`count` + 1)
		WHERE `city`.`ID_city` = " . $idCity;
		return $objDB->query($stmt);
	}

	/**
	 * уменьшаем число пользователей с указаной страной
	 */
	public static function decrementCountry($idCountry) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `country` SET `count` = (`count` - 1)
		WHERE `country`.`ID_country` = " . $idCountry;
		return $objDB->query($stmt);
	}

	/**
	 * увеличиваем число пользователей с указаным городом
	 */
	public static function incrementCountry($idCountry) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `country` SET `count` = (`count` + 1)
		WHERE `country`.`ID_country` = " . $idCountry;
		return $objDB->query($stmt);
	}

	/**
	 * инкремент количества сущностей пользователя в таблице `user`
	 */
	public static function incrementEssenceInUserTable($essence, $idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user`
		SET `user`.`" . $essence . "_amount` = (`user`.`" . $essence . "_amount` + 1)
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->query($stmt);
	}

	/**
	 * декримент количества сущностей пользователя в таблице `user`
	 */
	public static function decrementEssenceInUserTable($essence, $idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user`
		SET `user`.`" . $essence . "_amount` = (`user`.`" . $essence . "_amount` - 1)
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->query($stmt);
	}

	/**
   * Проверка формы для приглашения друзей
   *
   * @param unknown_type $arrInvite
   * @return unknown
   */
  public static function checkInvite($arrInvite) {
  	$e = Exception_Form::instance(); //создаем объект для хранения списка исключений

		$arrKeys = array_keys($arrInvite['form']);
  	for ($i = 0; $i < sizeof($arrKeys); $i++) {
	  	if (strlen($arrInvite['form'][$arrKeys[$i]]['e_mail']) < 10)
	  	  $e->addException('form_'.$arrKeys[$i].'_e_mail', 'Не заполнен E-Mail');
	  	if (User_User::isEMailExist($arrInvite['form'][$arrKeys[$i]]['e_mail'])) {
	  		$userId = User_User::getUserIdByEmail($arrInvite['form'][$arrKeys[$i]]['e_mail']);
	  		$arrUser = User_User::getUser($userId);
	  	  $e->addException('form_'.$arrKeys[$i].'_e_mail', 'Такой E-Mail уже зарегистрирован. Его <a href=\'' . W_ABSPATH . 'user/' . $arrUser['login'] . '\'>профиль</a>');
	  	}
	  	if (strlen($arrInvite['form'][$arrKeys[$i]]['name']) < 3)
	  	  $e->addException('form_'.$arrKeys[$i].'_name', 'Не заполнено имя');
		}

  	if ($arrInvite['card'] <= 0)
  	  $e->addException('card', 'Не выбрана картинка');
  	if (strlen($arrInvite['message']) < 3)
  	  $e->addException('message', 'Не заполнено поле сообщения');

    if ($e->isErrorExists()) // Если мы зафиксировали какие-то исключения, то выдаем окончательное исключение
      throw $e;
		return true;
  }

  /**
   * Сохраняем инфу о приглашениях
   *
   * @param unknown_type $arrInvite
   * @param unknown_type $userId
   */
  public static function saveFriendInvite($arrInvite, $userId, $i) {
		$objDB = Service_Database::instance();
		$stat="INSERT INTO `friends_invite` (`ID_user`, `e_mail`, `name`, `creation`)
		       VALUES('" . $userId . "', '" .  $arrInvite['form'][$i]['e_mail'] . "', '" . $arrInvite['form'][$i]['name'] . "', '" . Service_Date::gLocalTime2BD() . "')";
		$objDB->query($stat);
  }

/**
   * Возвращает пользователей приглашенных данным
   *
   * @param integer $userId
   * @return array
   */
  public static function getUserFriendInvites($userId) {
  	$objDB = Service_Database::instance();//Получаем подключение к БД
  	$stmt = "SELECT `friends_invite`.`e_mail`, `friends_invite`.`name`, `user`.`login`, `friends_invite`.`creation`
  	FROM `friends_invite`
  	LEFT JOIN `user` ON `user`.`e_mail` = `friends_invite`.`e_mail`
  	WHERE `friends_invite`.`ID_user` = '" . $userId . "'";  //формируем SQL-запрос
  	return $objDB->select($stmt);
  }

    /**
   * Возвращает всех приглашенных пользователей
   *
   * @return array
   */
  public static function getFriendInvites() {
  	$objDB = Service_Database::instance();//Получаем подключение к БД
  	$stmt = "SELECT `friends_invite`.`e_mail`, `friends_invite`.`name`, `user`.`login`, `friends_invite`.`creation`
  	FROM `friends_invite`
  	LEFT JOIN `user` ON `user`.`e_mail` = `friends_invite`.`e_mail`";  //формируем SQL-запрос
  	return $objDB->select($stmt);
  }

  /**
   * сохраняем настройки оповещения
   */
  public static function saveNotification($idUser, $arrNotification) {
  	$objDB = Service_Database::instance();
  	$stmt = "
  	SELECT COUNT(`notification`.`ID_user`)
  	FROM `notification`
  	WHERE `notification`.`ID_user` = " . $idUser;
  	$exist = $objDB->selectSimpleField($stmt);
  	if ($exist) {
  		$stmt = "
  		UPDATE `notification` SET
  		`topic` = " . $arrNotification['topic'] . ",
  		`answer` = " . $arrNotification['answer'] . ",
  		`comments` = " . $arrNotification['comments'] . ",
  		`password` = " . $arrNotification['pass'] . ",
  		`friend` = " . $arrNotification['friend'] . ",
  		`mail` = " . $arrNotification['mail'] . ",
  		`admin_blog` = " . $arrNotification['admin_blog'] . "
  		WHERE `notification`.`ID_user` = " . $idUser;
  		return $objDB->query($stmt);
  	}
  	else {
  		$stmt = "
  		INSERT INTO `notification` (`ID_user`, `topic`, `answer`, `comments`, `password`,  `mail`, `friend`)
  						VALUES(" . $idUser . ", " . $arrNotification['topic'] . ", " . $arrNotification['answer'] . ", " . $arrNotification['comments'] . ", " . $arrNotification['pass'] . ", " . $arrNotification['mail'] . ", " . $arrNotification['friend'] . ")";
  		return $objDB->query($stmt);
  	}
  }

  /**
   * получаем настройки оповещения
   */
  public static function getNotification($idUser) {
  	$objDB = Service_Database::instance();
  	$stmt = "
  	SELECT `notification`.`topic`,
  				 `notification`.`admin_blog`,
  				 `notification`.`answer`,
  				 `notification`.`comments`,
  				 `notification`.`mail`,
  				 `notification`.`password`,
  				 `notification`.`friend`,
  				 `notification`.`admin_blog`
  	FROM `notification`
  	WHERE `notification`.`ID_user` = " . $idUser;
  	return $objDB->selectOne($stmt);
  }

  /**
   * получаем конкретные настройки оповещения
   */
  public static function getOneNotification($idUser, $type) {
  	/*
  	$type
  	- topic
  	- answer
  	- comments
  	- mail
  	- password
  	- friend
  	- admin_blog
  	*/
  	$objDB = Service_Database::instance();
  	$stmt = "
  	SELECT `notification`.`" . $type . "`
  	FROM `notification`
  	WHERE `notification`.`ID_user` = " . $idUser;
  	return $objDB->selectSimpleField($stmt);
  }


	/**
	 * получаем e-mail'ы всех пользователей которым можно посылать сообщения
	 *
   *- topic
	 *- answer
   *- comments
   *- mail
   *- password
   *- friend
   *- admin_blog
	 *
	 */
	public static function getAllMailsFilterByNotificationType($type) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`e_mail`
		FROM `user`
		LEFT JOIN `notification` ON `notification`.`ID_user` = `user`.`ID_user`
		WHERE `notification`.`admin_blog` IS NULL OR `notification`.`admin_blog` = 1";
		return $objDB->selectSimpleArray($stmt);
	}

	/**
	 * Получает id пользователя
	 *
	 * @return integer
	 */
	public static function getId() {
		$objSesion = User_Session::instance();
		return $objSesion->getUserId();
	}




	/**
	 * добавляем место работы(профайл)
	 *
	 */
	public static function insertOperationalExperience($arrExperience, $idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		INSERT INTO `user_operational_experience`(`ID_user`,
																							`company`,
																							`site`,
																							`company_size`,
																							`job`,
																							`start_month`,
																							`start_year`,
																							`end_month`,
																							`end_year`,
																							`charge`,
																							`progress`,
																							`additionally`)
		VALUES (" . $idUser . ",
					 '" . $arrExperience['company'] . "',
					 '" . $arrExperience['site'] . "',
					  " . $arrExperience['company_size'] . ",
					 '" . $arrExperience['job'] . "',
					  " . $arrExperience['start_month'] . ",
					  " . $arrExperience['start_year'] . ",
					 '" . $arrExperience['end_month'] . "',
					 '" . $arrExperience['end_year'] . "',
					 '" . $arrExperience['charge'] . "',
					 '" . $arrExperience['progress'] . "',
					 '" . $arrExperience['additionally'] . "')";
		return $objDB->query($stmt);
	}

	/**
	 * обновляем место работы(профайл)
	 *
	 */
	public static function updateOperationalExperience($arrExperience, $ID_user_operational_experience) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `user_operational_experience`
		SET `company` = '" . $arrExperience['company'] . "',
				`site` = '" . $arrExperience['site'] . "',
				`company_size` = " . $arrExperience['company_size'] . ",
				`job` = '" . $arrExperience['job'] . "',
				`start_month` = " . $arrExperience['start_month'] . ",
				`start_year` = " . $arrExperience['start_year'] . ",
				`end_month` = '" . $arrExperience['end_month'] . "',
				`end_year` = '" . $arrExperience['end_year'] . "',
				`charge` = '" . $arrExperience['charge'] . "',
				`progress` = '" . $arrExperience['progress'] . "',
				`additionally` = '" . $arrExperience['additionally'] . "'
		WHERE `user_operational_experience`.`ID_user_operational_experience` = " . $ID_user_operational_experience;
		return $objDB->query($stmt);
	}

	/**
	 * получаем места работы(профайл)
	 *
	 */
	public static function getOperationalExperience($idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT *
		FROM `user_operational_experience`
		WHERE `user_operational_experience`.`ID_user` = " . $idUser . "
        ORDER BY `start_year` DESC";
		return $objDB->select($stmt);
	}

	/**
	 * удялем место работы
	 *
	 */
	public static function deleteOperationalExperience($idOperationalExperience, $idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		DELETE FROM `user_operational_experience`
		WHERE `user_operational_experience`.`ID_user_operational_experience` = " . $idOperationalExperience . " AND `user_operational_experience`.`ID_user` = " . $idUser;
		$objDB->query($stmt);
	}

	/**
	 * сохаряем информацию о поиске работы
	 *
	 * @param unknown_type $arrWork
	 * @return unknown
	 */
	public static function saveWorkSearch($arrWork) {
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		$stmt = "
		SELECT *
		FROM `work_search`
		WHERE `work_search`.`ID_work_search` = " . $idUser;
		$arrWorkSelect = $objDB->selectOne($stmt);

		if (!empty($arrWorkSelect)) {
			$updateTime = $arrWorkSelect['search_flag_creation'];

			if ($arrWork['search_flag'] == true AND $arrWorkSelect['search_flag'] == false)
				$updateTime = Service_Date::gLocalTime2BD();
			elseif ($arrWork['search_flag'] == false)
				$updateTime = '';

			$stmt = "
			UPDATE `work_search`
			SET `search_flag` = " . $arrWork['search_flag'] . ",
					`price` = " . $arrWork['price'] . ",
					`search_flag_creation` = '" . $updateTime . "',
					`show_price_flag` = " . $arrWork['show_price_flag'] . "
			WHERE `work_search`.`ID_work_search` = " . $idUser;
			return $objDB->query($stmt);
		}
		else {
			$stmt = "
			INSERT INTO `work_search` (`ID_work_search`, `search_flag`, `price`, `search_flag_creation`, `show_price_flag`)
			VALUES (" . $idUser . ", " . $arrWork['search_flag'] . ", " . $arrWork['price'] . ", '" . ($arrWork['search_flag'] ? Service_Date::gLocalTime2BD() : '') . "', " . $arrWork['show_price_flag'] . ")";
			return $objDB->query($stmt);
		}
	}

	/**
	 * получаем информацию о поиске работы
	 */
	public static function getWorkSearch($idUser) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `work_search`.`ID_work_search` AS `ID_user`,
					 `work_search`.`search_flag`,
					 `work_search`.`price`,
					 `work_search`.`search_flag_creation`,
					 `work_search`.`show_price_flag`,
					 `work_search`.`tags`
		FROM `work_search`
		WHERE `work_search`.`ID_work_search` = " . $idUser;
		return $objDB->selectOne($stmt);
	}

	/**
	 * получаем список пользователей по сторке с id
	 */
	public static function getListOfUsersByIds($strUserIds) {
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT *
		FROM `user`
		WHERE `user`.`ID_user` IN (" . $strUserIds . ")";
		return $objDB->select($stmt);
	}

  /**
   * получение аккаунтов пользхователя
   */
  public static function getUserAccounts($idUser) {
    $objDB = Service_Database::instance();
    $stmt = "
     SELECT `user_accounts`.`url`
     FROM `user_accounts`
     WHERE `user_accounts`.`ID_user` = " . $idUser;
    return $objDB->selectSimpleArray($stmt);
  }

  /**
   * сохранение аккаунтов пользователя
   */
  public static function saveUsersAccounts($arrAccounts) {
    $objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();

    $stmt = "
    DELETE FROM `user_accounts`
    WHERE `user_accounts`.`ID_user` = " . $idUser;
    $objDB->query($stmt);

    foreach ($arrAccounts as $account) {
      $stmt = "
        INSERT INTO `user_accounts` (`user_accounts`.`ID_user`, `user_accounts`.`url`)
        VALUES (" . $idUser . ", '" . $account . "')";
        $objDB->query($stmt);

    }
    return true;
  }
}
?>